#pragma once

#include "../Utilities/DirectoryScanner.h"
#include "../Utilities/ChineseExtractor.h"

#include <iostream>
#include <fstream>
#include <sstream>
#include <iterator>
#include <string>
#include <set>
#include <map>
#include <regex>
#include <ctype.h>

#include <cppjieba/Jieba.hpp>
#include <utfcpp/utf8.h>

using std::ifstream;
using std::ofstream;
using std::istringstream;
using std::string;
using std::set;
using std::map;
using std::pair;

// 词典、索引的类型
using dictMap = map<string, u_long>;  
using indexMap = map<string, set<u_long>>;

// 存放生成的词典文件和索引文件的目录，注意以'/'结尾(方便拼接文件名)
static const string processOutDir = "./processedCorpus/";  

class KeyWordProcessor {
public:
    KeyWordProcessor(const string& enStopWordsFile, const string& cnStopWordsFile);
	 
    /**
     * @brief 外部可用接口，生成四个文件：英文词典库和索引库，中文词典库和索引库
     * @param cnDir 中文语料所在目录
     * @param enDir 英文语料所在目录
     */
    void process(const string& enDir, const string& cnDir);

private:
    // 英文
    dictMap create_en_dict(const string& enDir, const string& outfile);
    void build_en_index(dictMap& dict, const string& outfile);

    // 中文
    dictMap create_cn_dict(const string& cnDir, const string& outfile);
    void build_cn_index(dictMap& dict, const string& outfile);
    
    // 工具函数：将字符串中的非字母符号替换成空格，将大写字母转为小写
    void cleanString(string & str);
private:
    cppjieba::Jieba m_tokenizer;   // 中文分词器
    set<string> m_enStopWords;     // 英文的停用词
    set<string> m_cnStopWords;     // 中文的停用词
};